<?php

/**
 * 默认控制器
 */
class Controller_Interface extends Controller_Abstract
{
    function actionCode()
    {
        return Helper_Ckcode::entry();
    }
    /**
     * 
     * @param远程文件的地址
     * @param $dir保存的目录
     * @return mixed
     */
    function curl_download($url, $dir) {
        $ch = curl_init($url);
        $fp = fopen($dir, "wb");
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $res=curl_exec($ch);
        curl_close($ch);
        fclose($fp);
        return $res;
    }
    function downzip($url){

        $url=urldecode($url);
        $fname=basename("$url"); //返回路径中的文件名部分 fetion_sms.zip
        $str_name=pathinfo($fname); //以数组的形式返回文件路径的信息
        $extname=strtolower($str_name['extension']); //把扩展名转换成小写

        $time=date("Ymd",time());
        global $root_dir;
        $upload_dir = $root_dir."/tmp/updatedown";//上传的路径
        $file_name=$time.rand(1000,9999).'.'.$fname;
        $dir=$upload_dir.$file_name;//创建上传目录
        //判断目录是否存在 不存在则创建
        if(!file_exists($upload_dir)){
           
            @mkdir ( $upload_dir, 0700 );
        }
        $contents= $this->curl_download($url,$dir);
        if($contents){
            return array('code'=>0,'data'=>$upload_dir.$file_name);
         
            
        }else{
            return array('code'=>1,'msg'=>'app.zip文件下载失败，请联系管理员');

        }
    }

    
    function actiontestold(){
    $authdir = Q::ini ( 'app_config/ROOT_DIR' ) .'/tmp/auth';
    if(!is_dir($authdir)){
        @mkdir ( $authdir, 0700 );
    }
    $authfile = $authdir.'/auth.txt';
    $authstr = file_get_contents($authfile);
    $config = Q::ini ( 'appini/offerwall' );
    if (strlen ( $config ['key'] ) > 24)
        $config ['key'] = substr ( $config ['key'], 0, 24 );
    $crypt = new Helper_crypt3des ( $config ['key'], $config ['iv'] );
    $auth_decodestr = $crypt->decrypt($authstr);
    $auth_array = json_decode($auth_decodestr,true);
    var_dump($auth_array);die;
 }
 
 function deldir($path){
     //如果是目录则继续
     if(is_dir($path)){
         //扫描一个文件夹内的所有文件夹和文件并返回数组
         $p = scandir($path);
         foreach($p as $val){
             //排除目录中的.和..
             if($val !="." && $val !=".."){
                 //如果是目录则递归子目录，继续操作
                 if(is_dir($path.$val)){
                     //子目录中操作删除文件夹和文件
                     $this->deldir($path.$val.'/');
                     //目录清空后删除空文件夹
                     @rmdir($path.$val.'/');
                 }else{
                     //如果是文件直接删除
                     unlink($path.$val);
                 }
             }
         }
     }
 }
 /**
  * 复制文件夹
  * @param $source
  * @param $dest
  */
 function copydir($source, $dest)
 {
     if (!file_exists($dest)) @mkdir($dest,0700);
     $handle = opendir($source);
     while (($item = readdir($handle)) !== false) {
         if ($item == '.' || $item == '..') continue;
         $_source = $source . '/' . $item;
         $_dest = $dest . '/' . $item;
         if (is_file($_source)) copy($_source, $_dest);
         if (is_dir($_source)) $this->copydir($_source, $_dest);
     }
     closedir($handle);
 }
 /***
  * 测试更新
  */
 function actiontest(){
 
     global $root_dir;

     $checktag = false;
     $time = time();
    
     $now_version = EDU_VERSION;

     $sign = md5(sprintf('%d%s%s',$time,'edulive66688!@#*&6677^',$now_version)) ;
     $authresult = Helper_Common::cget('http://eduauth.huiyaotech.cn/interface/checkupdate?sign='.$sign .'&time='.$time.'&version='.$now_version);
//var_dump($authresult);
     //{"code":0,"data":"wwD9922g2QF+6JjFP3+wt+mNJdGi6I9t","sqldownurl":"http:\/\/eduauth.huiyaotech.cn\/1.sql"}
     $authresult = json_decode($authresult,true);
     if(is_array($authresult) && $authresult['code'] == 0){
         echo '开始更新<br/>';
         $checktag = true;
         $sqlurl = $authresult['sqldownurl'];
       
     }else{
         if(empty($authresult)){
             echo '更新网络请求出错<br/>';
         }else{
             if(!empty($authresult['msg'])){
                 echo $authresult['msg'];die;
             }else{
                 echo '请求出错啦<br/>';die;
             }
         }
     }

     if ($checktag){
         
         //备份数据库
         
          $sqlbak_filename = '/tmp/'.EDU_VERSION.'_'.date('YmdHis').'sql.gz';
         
          $exec="/usr/bin/mysqldump -hlocalhost -uedulive -proot edulive | gzip > {$sqlbak_filename}";
          exec($exec,$result,$status);
          
          if(is_file($sqlbak_filename) && filesize($sqlbak_filename) > 0){
              echo "数据库备份成功<br/>";
          }
          
         //备份核心文件
          echo "开始备份 核心文件<br/>";
          $app_path =  Q::ini ( 'app_config/ROOT_DIR' ) . '/app';
          $dest = '/tmp/app'.$now_version;
          $this->copydir($app_path, $dest);
          echo "核心文件备份完成<br/>";
          
          //备份配置文件
          echo "开始备份配置文件<br/>";
          $config_path =  Q::ini ( 'app_config/ROOT_DIR' ) . '/config';
          $dest = '/tmp/config'.$now_version;
          $this->copydir($config_path, $dest);
          echo "配置文件备份完成<br/>";
         
          //备份完成开始更新
          
          //更新数据库文件---数据库文件至关重要，如果更新失败了不能继续执行下面的操作 防止整套系统宕掉
          echo "开始更新数据库<br/>";
          $sqlupdate = file_get_contents($sqlurl);
          
          
          try {
              QDB::getConn()->execute($sqlupdate);
              echo '数据库更新成功';
          } catch (Exception $e) {//数据库如果更新文件报错停止更新
              echo "<b style= 'color:red'>数据库更新报错,自动更新终止</b><br/>";
              Helper_Common::log('数据库更新报错'.print_r($e->getMessage())."<br/>");
              print_r($e->getMessage())."<br/>";
              die;
          }
          

          //更新配置文件
          $update_config_sh = 'cd '.$root_dir.'/config/  &&  /usr/bin/svn update --accept tc --force --no-auth-cache --username "devel" --password "devel168178"';
          exec($update_config_sh,$result,$status);
       
        if($status){
             //更新成功
             echo "<c style='color:red;'>配置文件更新失败<br/></c>";
         }else{
             echo "配置文件更新成功<br>";
             Helper_Common::log('配置文件命令成功, 结果如下<br>'.  var_export( $result,true)."<br/>");
             print_r( $result );
         }
     
          //更新public
         
         $update_public_sh = '/usr/bin/svn update /data/edulive/public/updateadd --accept tc --force --no-auth-cache --username "devel" --password "devel168178"';
        // echo $update_public_sh;
         exec($update_public_sh,$result,$status);
        
       
        if($status){
             //更新成功
            
             echo "<c style='color:red;'>公共样式文件public更新失败<br/></c>";
             print_r( $result );
         }else{
             echo "公共样式文件public更新成功<br>";
             print_r( $result );
             Helper_Common::log('公共样式文件public更新成功, 结果如下, 结果如下<br>'.  var_export( $result,true)."<br/>");
         }
      //  die;
        
         //更新代码app
         $update_app_sh = 'cd '.$root_dir.'/app/  &&  /usr/bin/svn update --accept tc --force --no-auth-cache --username "devel" --password "devel168178"';
      
         exec($update_app_sh,$result,$status);
         if($status){
             //更新成功
               echo "<c style='color:red;'>核心代码app更新失败<br/></c>";
               print_r( $result );
         }else{
             echo "核心代码更新成功<br/>";
             Helper_Common::log('核心app文件更新成功, 结果如下<br>'.  var_export( $result,true)."<br/>");
             //print_r( $result );
         }
        //删除缓存文件  /tmp/runtime/cache的子文件
         $this->deldir(Q::ini ( 'app_config/ROOT_DIR' ) . '/tmp/runtime_cache/');
         echo "缓存文件删除成功，系统自动更新完成。<br/>当前版本为<b style = 'color:red'>".EDU_VERSION."</b>";
         die;
     }
   }
} 
